package com.example.newsSys.interceptor;

import com.example.newsSys.constants.SessionConstants;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
// 拦截器 仅用于拦截并处理动态请求，静态资源不拦截
@Slf4j // lombok中也有slf4j注解
@Component
public class LoginInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

        //判断当前拦截到的是Controller的方法还是其他资源
        if (!(handler instanceof HandlerMethod)) {
            return true;
        }
        // 获取session判断用户是否已经登录
        String user = (String) request.getSession().getAttribute(SessionConstants.USER_SESSION);
        if(user == null) {
            /*
             * 如果查询到的用户为空则没有登录，由于是异步请求，无法直接重定向，因此返回302状态码，由前端进行重定向跳转
             * 也可以抛出异常，在异常拦截器中向前端返回302状态码
             */

            /*
            方案1. 直接向前端返回302状态码
            Result result = Result.ERROR(302,"用户未登录");
            ObjectMapper objectMapper = new ObjectMapper();
            String resultJsonString = objectMapper.writeValueAsString(result);
            response.setContentType("text/html;charset=utf8");
            ServletOutputStream os = response.getOutputStream();
            os.write(resultJsonString.getBytes("utf-8"));
            return false;
            */

            // 方案2. 抛出异常 由全局异常处理器给出日志信息并向前端回传状态码
            String uri = request.getRequestURI();
            throw new RuntimeException(uri);
        }
        // 反之则放行
        return true;
    }
}